﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <assert.h>
#include <ctype.h>
//模拟实现atoi
//int atoi( const char *string );
//把参数 str 所指向的字符串转换为一个整数（类型为 int 型）
//该函数返回转换后的长整数，如果没有执行有效的转换，则返回零。
//只能转换数字字符串，如果数字前面有字母则非法转换失败
// 第一个字符只能是数字或者+ -
//例如:"123abc"--->123
//"+123"--->123    "-123"--->123
//"abc123"--->转换失败返回0


//参考代码
//
//#include <stdio.h>
//#include <stdlib.h>
//#include <ctype.h>
////VALID 表示结果合法
////INVALID 表示结果非法
//enum State
//{
//    VALID,//0
//    INVALID//1
//};
////默认结果可能非法，当正确转换后再改为合法
//enum State state = INVALID
//​
//int my_atoi(char* str)
//{
//    int flag = 1;
//    long long ret = 0;
//    assert(str);
//    state = INVALID;
//    //跳过空白字符
//    while (isspace(*str))
//    {
//        str++;
//    }
//    if (*str == '\0')
//    {
//        return 0;
//    }
//    //跳过正负号
//    if (*str == '+')
//    {
//        str++;
//    }
//    else if (*str == '-')
//    {
//        flag = -1;
//        str++;
//    }
//    //开始转换数字字符直到非数字字符
//    while (isdigit(*str))
//    {
//        ret = ret * 10 + flag * (*str - '0');
//        if ((ret > INT_MAX) || (ret < INT_MIN))
//        {
//            return 0;
//        }
//        str++;
//    }
//    //正常停止
//    if (*str == '\0')
//    {
//        state = VALID;
//        return (int)ret;
//    }
//    else
//    {
//        //遇到非数字字符
//        return (int)ret;
//    }
//}
//​
//int main()
//{
//    char* p = "-1212212121212";
//    printf("%d\n", my_atoi(p));
//    return 0;
//}

//
//int my_atoi(const char* str)
//{
//	assert(str);
//	char* string = str;
//	int count = 0;//存放数字字符个数
//	if (isalpha(*str) == 1)
//		return 0;
//	if (*str == '\0')
//		return 0;
//	else
//	{
//		//此时有两种可能
//		//1.第一个字母是数字
//		if (isdigit(*str) == 1)
//		{
//			if (isdigit(*str + 1) == 0)//第二个字符不是数字
//				return 0;
//
//			
//
//		}
//		//2.第一个字母不是数字
//		if (*str == '+' || *str == '-')
//		{
//
//		}
//		else
//			return 0;
//	}
//}
//int main()
//{
//	
//	int ret = 0;//接收返回值
//	char str[20] = { 0 };
//	scanf("%s", str);
//	ret = my_atoi(str);
//	printf("字符串：%s 整型值：%d", str, ret);
//	
//	return 0;
//}

//#include <string.h>
//#include <stdlib.h>
//int main()
//{
//	int ret = 0;
//	char str[20] = { 0 };
//	scanf("%s", str);
//	ret = atoi(str);
//	printf("字符串：%s 整型值：%d", str, ret);
//	return 0;
//}



//模拟实现strncpy
//char *strncpy( char *strDest, const char *strSource, size_t count );
//不拷贝\0
//
//char* my_strncpy(char* dest,const char* src,size_t count)
//{
//	assert(dest && src);
//	char* ret = dest;
//	
//	while (*src && count)
//	{
//		*dest = *src;
//		src++;
//		dest++;
//		count--;
//	}
//	return ret;
//}
//
//int main()
//{
//	char arr1[20] = { 0 };
//	char arr2[] = "abcdef";
//	my_strncpy(arr1, arr2, 3);
//	printf("%s\n", arr1);
//	return 0;
//}



//模拟实现strncat
//char *strncat( char *strDest, const char *strSource, size_t count );
//  \0也拼接
//如果src的字符小于count也不会补0
////
//char* my_strncat(char* dest,const char* src,size_t count)
//{
//	assert(dest && src);
//	char* ret = dest;
//	//先找到dest第一个\0的地址，再从这里拼接
//	while (*dest)
//	{
//		dest++;
//	}
//	//拼接
//	while (*src && count)
//	{
//		*dest = *src;
//		dest++;
//		src++;
//		count--;
//	}
//	*dest = '\0';
//	return ret;
//
//}
//
//int main()
//{
//	char arr1[30] = "#######\0#################";
//	char arr2[] = "abcdef";
//	my_strncat(arr1,arr2,8);
//	printf("%s\n", arr1);
//	return 0;
//}



